Dotaz k osvetleni struktury MESSAGE

Otázka od: Petr Vařeka

16. 10. 2002 19:01

Zdravim konferu.

V dokumentaci jsem nalezl, ze MESSAGE je record s nasl. variantni
strukturou:
type
  TMessage =packedrecord
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: Longint;
        LParam: Longint;
        Result: Longint);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
 end;
Je zrejme, ze tato struktura je zavisla na tom, zda jiste pole nabyva
hodnoty 0 ci 1.
Prosim sdelte mi, ktere to je pole - z dokumentace jsem to totiz vubec
nepochopil.

Petr Vareka.

Odpovedá: Tomas Grepl

16. 10. 2002 22:22

> V dokumentaci jsem nalezl, ze MESSAGE je record s nasl. variantni
> strukturou:
> type
> TMessage =packedrecord
> Msg: Cardinal;
> case Integer of
> 0: (
> WParam: Longint;
> LParam: Longint;
> Result: Longint);
> 1: (
> WParamLo: Word;
> WParamHi: Word;
> LParamLo: Word;
> LParamHi: Word;
> ResultLo: Word;
> ResultHi: Word);
> end;
> Je zrejme, ze tato struktura je zavisla na tom, zda jiste pole nabyva
> hodnoty 0 ci 1.
> Prosim sdelte mi, ktere to je pole - z dokumentace jsem to totiz vubec
> nepochopil.

Hodnoty 0 a 1 jsou tam pouze symbolicky, klidne by tam slo napsat i jakakoli
jina cisla a nic by se nezmenilo (program musi nejak jinak urcit, kterou
variantu ma v dane chvili pouzit) .
Pokud by tam bylo case Neco:integer of, tak by to Neco zabralo i nejake
bajty, ale takto jde pouze o formalni zapis ruznych variant.

Proste bud TMessage pouzivas jako.
   TMessage =packed record
     Msg: Cardinal;
     WParam: Longint;
     LParam: Longint;
     Result: Longint;
   end

nebo jako

 TMessage =packed record
   Msg: Cardinal;
   WParamLo: Word;
   WParamHi: Word;
   LParamLo: Word;
   LParamHi: Word;
   ResultLo: Word;
   ResultHi: Word;
end;

Lze to ale klidne i kombinovat.
Napr. Msg.WParamHi + Msg.LParam + Msg.WParam.

Udaje se v pameti fyzicky prekryvaji. Tzn. pokud zmenim WParam (4 byty), tak
se soucasne zmeni i WParamLo (2 byty) a WParamHi (2 byty) a plati to
samozrejme i obracene.

Tomas